@风铃
2年前 提问
1个回答
AES有哪些模块组成
帅末
2年前
AES结构由以下4个不同模块组成:
字节代替:使用一个表(被称为S盒)对分组进行逐一字节替换。S盒是AES算法定义的矩阵,把State中每个字节的高4位作为行值,低4位作为列值,然后取出S一盒中对应行列的元素作为输出。这个步骤提供了AES算法加密的非线性变换能力。S盒与有限域乘法逆元有关,具有良好的非线性特性。为了避免简单代数攻击,S盒结合了乘法逆元及可逆的仿射变换矩阵建构而成。
行移位:行移位变换完成基于行的循环移位操作,变换方法为第0行不变,第1行循环左移1个字节,第2行循环左移两个字节,第3行循环左移3个字节,代码如下;
int a[4][4] = {
{0x87, 0xF2, 0x4D, 0x97},
{0xEC, 0x6E, 0x4C, 0x90},
{0x4A, 0xC3, 0x46, 0xE7},
{0x8C, 0xD8, 0x95, 0xA6}
};
int b[4][4];//行移位后的矩阵
int main() {
//行移位
for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
b[i][j] = a[i][(i+j)%4];
for(int i=0;i<=3;i++) {
for(int j=0;j<=3;j++) {
cout<<hex<<b[i][j]<<" ";
}
cout<<endl;
}
}
- 列混淆:一般是将两个不同的矩阵相乘来实现列混淆,代码如下;
int mul_mat(int x,int y) {
if(x == 0x01) {
return y;
}
else if(x == 0x02) {
if((y&128) != 128) { //二进制首位为0
return y<<1;
}
else {
int temp = ((y<<1)&((1<<8)-1)); //向左移一位,删掉最高位(保留8位)
return temp^(0x1b);
}
}
else if(x == 0x03) {
return mul_mat(0x02,y)^y;
}
}
- 轮密钥加:用轮密钥矩阵的第 i 列,与上面得到的列混淆矩阵的第 i 列进行异或运算,得到最后的矩阵就是轮密钥加,代码如下。
for(int i=0;i<=3;i++) {
for(int j=0;j<=3;j++) {
res[j][i] = resMix[j][i] ^ round_key[j][i];
}
}